<?php

class Http
{

	static function client_ip($_single = true)
	/**
	 * Вернуть IP адрес(а) клиента.
	 *
	 * Анализирует переменные окружения и возвращает наиболее вероятный IP-адрес клиента.
	 *
	 * @static
	 * @access public
	 * @param boolean $_single если true вернет наиболее вероятный адрес, false -- всю цепочку (список адресов).
	 * @return mixed
	 */
	{
		$ip = array();
		// nginx + apache
		if (isset($_SERVER['HTTP_X_REAL_IP']))       { $ip[] = $_SERVER['HTTP_X_REAL_IP'];       }
		// squid и т.п.
		if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip[] = $_SERVER['HTTP_X_FORWARDED_FOR']; }
		// х.з.
		if (isset($_SERVER['HTTP_REMOTE_ADDR']))     { $ip[] = $_SERVER['HTTP_REMOTE_ADDR'];     }
		// откуда реально подключились (м.б. адрес прокси)
		if (isset($_SERVER['REMOTE_ADDR']))          { $ip[] = $_SERVER['REMOTE_ADDR'];          }

		$ip = array_values(array_unique($ip)); // выбираем уникальные и восстанавливаем нумерацию ключей массива.
		if (empty($ip) || empty($ip[0])) { $ip = array(NULL); }

		if ($_single) { return $ip[0]; }
		return $ip;
	}

	static public function redirect($url, $timeout=0)
	{
		if (headers_sent()) return false;

		if ($timeout > 0) {
			header ('Refresh: ' . $timeout . '; URL="' . $url .'"');
		} else {
			header ('Location: ' . $url);
			die();
		}
		return true;
	}

	static public function header($str)
	{
		header($str);
	}

	static public function status($num)
	{
		static $http = array (
			100 => "100 Continue",
			101 => "101 Switching Protocols",
			200 => "200 OK",
			201 => "201 Created",
			202 => "202 Accepted",
			203 => "203 Non-Authoritative Information",
			204 => "204 No Content",
			205 => "205 Reset Content",
			206 => "206 Partial Content",
			300 => "300 Multiple Choices",
			301 => "301 Moved Permanently",
			302 => "302 Found",
			303 => "303 See Other",
			304 => "304 Not Modified",
			305 => "305 Use Proxy",
			307 => "307 Temporary Redirect",
			400 => "400 Bad Request",
			401 => "401 Unauthorized",
			402 => "402 Payment Required",
			403 => "403 Forbidden",
			404 => "404 Not Found",
			405 => "405 Method Not Allowed",
			406 => "406 Not Acceptable",
			407 => "407 Proxy Authentication Required",
			408 => "408 Request Time-out",
			409 => "409 Conflict",
			410 => "410 Gone",
			411 => "411 Length Required",
			412 => "412 Precondition Failed",
			413 => "413 Request Entity Too Large",
			414 => "414 Request-URI Too Large",
			415 => "415 Unsupported Media Type",
			416 => "416 Requested range not satisfiable",
			417 => "417 Expectation Failed",
			500 => "500 Internal Server Error",
			501 => "501 Not Implemented",
			502 => "502 Bad Gateway",
			503 => "503 Service Unavailable",
			504 => "504 Gateway Time-out"
		);

		$status = $http[$num];
		if (substr(php_sapi_name(), 0, 3) == 'cgi')
			self::header('Status: ' . $status, TRUE);
		else
			self::header($_SERVER['SERVER_PROTOCOL'] . ' ' . $status);
	}

}

?>
